package cn.rxyb.core.io;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * @author YJH
 * @version 1.0
 * @description IO工具类只是辅助流的读写，并不负责关闭流。原因是流可能被多次读写，读写关闭后容易造成问题。
 * @date 2020/6/28 13:56
 */
public class IoUtil {


    /**
     * 文件转为流
     *
     * @param file 文件
     * @return {@link FileInputStream}
     */
    public static FileInputStream toStream(File file) throws FileNotFoundException {
        return new FileInputStream(file);
    }

    /**
     * 获得输入流
     *
     * @param path Path
     * @return 输入流
     * @throws RuntimeException 文件未找到
     */
    public static InputStream getInputStream(Path path) throws RuntimeException {
        try {
            return new BufferedInputStream(Files.newInputStream(path));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 获得输入流
     * <p>
     * A BufferedInputStream为另一个输入流添加了功能，即缓冲输入和支持mark和reset方法的功能。
     * 当创建BufferedInputStream时，将创建一个内部缓冲区数组。
     * 当从流中读取或跳过字节时，内部缓冲区将根据需要从所包含的输入流中重新填充，一次有多个字节。
     * mark操作会记住输入流中的一点，并且reset操作会导致从最近的mark操作之后读取的所有字节在从包含的输入流中取出新的字节之前重新读取。
     * </p>
     *
     * @param file 文件
     * @param path Path
     * @return 输入流
     * @throws RuntimeException 文件未找到
     */
    public static InputStream getInputStream(File file) throws RuntimeException {
        try {
            return new BufferedInputStream(IoUtil.toStream(file));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 流关闭
     *
     * @param in
     */
    public static void close(Closeable in) {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
